//  ts的类
class Person{
    public name:string      //  public在本类里可以访问 在其子类里也可以访问 在外部也可以访问
    protected age:number    //  protected 可以在本类和子类里被访问 不可以在外部被访问
    private sex:string      //  private 只可以在本类被访问
    static num:string = '20'    //  静态属性
    constructor(name:string,age:number,sex:string){
        this.name = name
        this.age = age
        this.sex = sex
    }
    getName():string{
        return this.name
    }
    setName(name:string):void{
        this.name = name
    }
    getAge():number{
        return this.age
    }
    setAge(age:number):void{
        this.age = age
    }
    getSex():string{
        return this.sex
    }
    setSex(sex:string):void{
        this.sex = sex
    }
    run():string{

        return `${this.name}在运动`
    }
    //  静态方法
    static print():string{
        //  静态方法不能访问类的变量
        //console.log(this.name)
        return Person.num
    }
}
const p = new Person('ywj',21,'男')
console.log(p.getName())
console.log(p.run())
//  ts的继承
class Web extends Person{
    constructor(name:string,age:number,sex:string){
        super(name,age,sex)
    }
    run():string{
        //  public和protected可以在子类里被访问
        //  private不可以在子类里被访问
        return `${this.name}在运动---子类${this.age}---`
    }
}
const w = new Web('YWJ',18,'男')
//  子类和父类有相同的方法 优先执行子类的方法
console.log(w.run())
//  public可以在外部访问
console.log(w.name)
//  protected无法在外部访问
// console.log(w.age)
//  private无法在外部访问
// console.log(w.sex)


console.log(Person.print())

//  多态 父类定义方法 子类实现


//  抽象方法 抽象类
//  抽象类中可以含有抽象方法 也可以有实例方法
abstract class Animal{
    public name:string
    constructor(name:string){
        this.name = name
    }
    abstract eat():any
    abstract run():string
    play(){
        console.log(this.name+'在玩耍')
    }
}
//  继承抽象方法的子类 必须实现父类抽象类中的抽象方法
class Dog extends Animal{
    constructor(name:string){
        super(name)
    }
    eat():any{
        return `${this.name}在吃`
    }
    run():string{
        return `${this.name}在跑`
    }
}
const dog = new Dog('ywj')
console.log(dog.eat())
console.log(dog.run())
dog.play()